package com.autumn.annotations.run;

import com.autumn.annotations.bean.config.FactoryBeanDemoConfig;
import com.autumn.xa.common.util.FrameworkUtils;
import com.autumn.annotations.ioclife.config.BeanImplDemoConfig;
import com.autumn.annotations.ioclife.config.BeanPostProcesserDemoConfig;
import com.autumn.annotations.ioclife.config.IocLifeDemoConfig;
import com.autumn.annotations.ioclife.config.JSR250DemoConfig;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * ClassName: IocLifeRun
 *
 * @Description:
 * @Author: wangqiuyang
 * @Date: 2022/1/25 2:29 下午
 * History:
 * <author>          <time>          <version>          <desc>
 * wangqiuyang    2022/1/25 2:29 下午   @Version 1.0        描述
 */
public class IocLifeRun {

    /**
    * Description: ioc demo bean生命周期
    * @param
    * @return: void
    * @author: wangqiuyang
    * @Date: 2022/1/25 2:42 下午
    */
    @Test
    public void iocDemo () {
        AnnotationConfigApplicationContext contxt = new AnnotationConfigApplicationContext(IocLifeDemoConfig.class);
        System.out.println("ioc 初始化完成 ......");

        // 输出所有的bean名字
        FrameworkUtils.printAllBeanNames(contxt);

        /*
            生成：
                如果为单实例 ioc初始化的时候创建bean
                如果为多实例 在getBean的时候创建bean

            初始化：
                对象创建完成 并完成赋值的时候 调用init方法

            销毁：
                如果bean为单实例  容器关闭时候调用detory方法
                如果bean为多实例  容器不会管理bean 也不会调用detory方法

        */

        // 关闭容器
        System.out.println("ioc 容器开始关闭 ......");
        contxt.close();
        System.out.println("ioc 容器关闭完成 ......");
    }

    /**
    * Description: bean实现方法 完成生命周期
    * @param
    * @return: void
    * @author: wangqiuyang
    * @Date: 2022/1/25 2:43 下午
    */
    @Test
    public void beanImplDemo () {
        AnnotationConfigApplicationContext contxt = new AnnotationConfigApplicationContext(BeanImplDemoConfig.class);
        System.out.println("ioc 初始化完成 ......");

        // 输出所有的bean名字
        FrameworkUtils.printAllBeanNames(contxt);

        // 关闭容器
        System.out.println("ioc 容器开始关闭 ......");
        contxt.close();
        System.out.println("ioc 容器关闭完成 ......");
    }

    /**
     * Description: JSR250方式 调用生命周期
     * @param
     * @return: void
     * @author: wangqiuyang
     * @Date: 2022/1/25 2:43 下午
     */
    @Test
    public void jsr250Demo () {
        AnnotationConfigApplicationContext contxt = new AnnotationConfigApplicationContext(JSR250DemoConfig.class);
        System.out.println("ioc 初始化完成 ......");

        // 输出所有的bean名字
        FrameworkUtils.printAllBeanNames(contxt);

        // 关闭容器
        System.out.println("ioc 容器开始关闭 ......");
        contxt.close();
        System.out.println("ioc 容器关闭完成 ......");
    }

    /**
     * Description:  通过 BeanPostProcesserDemoConfig 方式 调用生命周期
     * @param
     * @return: void
     * @author: wangqiuyang
     * @Date: 2022/1/25 2:43 下午
     */
    @Test
    public void beanPostProcesserDemo () {
        AnnotationConfigApplicationContext contxt = new AnnotationConfigApplicationContext(BeanPostProcesserDemoConfig.class);
        System.out.println("ioc 初始化完成 ......");

        // 输出所有的bean名字
        FrameworkUtils.printAllBeanNames(contxt);

        /*
            生命周期 ：执行顺序 new Obj -> populateBean (给bean赋值) -> postProcessBeforeInitialization -> init -> postProcessAfterInitialization

         */

        // 关闭容器
        System.out.println("ioc 容器开始关闭 ......");
        contxt.close();
        System.out.println("ioc 容器关闭完成 ......");
    }
}
